package com.guomei.mapper.curse;

import com.guomei.bean.curse.Course;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 课程表数据访问接口
 */
@Mapper
public interface CourseMapper {
    /**
     * 根据ID查询课程
     * @param id 课程ID
     * @return 课程信息
     */
    Course selectById(Long id);


    /**
     * 根据ID查询课程（包含教师信息）
     * @param id 课程ID
     * @return 课程信息（包含教师信息）
     */
    Course selectByIdWithTeacher(Long id);

    /**
     * 查询所有课程
     * @return 课程列表
     */
    List<Course> selectAll();

    /**
     * 查询所有课程
     * @return 课程列表
     */
    List<Course> selectCourseTypeIsOne();

    /**
     * 根据条件查询课程
     * @param course 课程查询条件
     * @return 课程列表
     */
    List<Course> selectByCondition(Course course);

    /**
     * 根据条件查询课程（包含教师信息）
     * @param course 课程查询条件
     * @return 课程列表（包含教师信息）
     */
    List<Course> selectByConditionWithTeacher(@Param("course") Course course);

    /**
     * 新增课程
     * @param course 课程信息
     * @return 影响行数
     */
    int insert(Course course);

    /**
     * 批量新增课程
     * @param courses 课程列表
     * @return 影响行数
     */
    int batchInsert(@Param("courses") List<Course> courses);

    /**
     * 根据ID更新课程
     * @param course 课程信息
     * @return 影响行数
     */
    int updateById(Course course);

    /**
     * 根据ID删除课程
     * @param id 课程ID
     * @return 影响行数
     */
    int deleteById(Long id);

    /**
     * 批量删除课程
     * @param ids 课程ID列表
     * @return 影响行数
     */
    int batchDelete(@Param("ids") List<Long> ids);

    /**
     * 根据分类ID查询课程列表
     * @param categoryId 分类ID
     * @return 课程列表
     */
    List<Course> selectByCategoryId(@Param("categoryId") Long categoryId);

    /**
     * 根据分类ID查询课程列表（包含教师信息）
     * @param categoryId 分类ID
     * @return 课程列表（包含教师信息）
     */
    List<Course> selectByCategoryIdWithTeacher(@Param("categoryId") Long categoryId);

//    /**
//     * 根据分类ID列表查询课程列表
//     * @param categoryIds 分类ID列表
//     * @return 课程列表
//     */
//    List<Course> selectByCategoryIds(@Param("categoryIds") List<Long> categoryIds);

    /**
     * 根据多个课程ID查询课程列表
     * @param courseIds 课程ID列表
     * @return 课程列表
     */
    List<Course> selectByIds(@Param("courseIds") List<Long> courseIds);

    /**
     * 根据教师ID查询课程及其订单信息
     * @param teacherId 教师ID
     * @return 课程列表，每个课程包含相关的订单信息
     */
    List<Course> selectCourseWithOrdersByTeacherId(@Param("teacherId") Long teacherId, @Param("payStatus") Short payStatus);

    /**
     * 查询课程列表及统计信息（包含订单数量、销售金额、分销老师数量、分销金额）
     * @param courseName 课程名称（模糊查询）
     * @param status 课程状态
     * @param courseType 课程类型
     * @return 课程统计列表
     */
    List<com.guomei.bean.curse.vo.CourseWithStats> selectCourseWithStats(
        @Param("courseName") String courseName, 
        @Param("status") Short status, 
        @Param("courseType") Short courseType
    );

    /**
     * 查询分销课程列表（联表查询 Course 和 CourseDistributerRel）
     * 查询所有符合条件的课程，LEFT JOIN时只带上该teacherId的分销关系
     * @param dto 查询条件（包含必传的teacherId用于过滤分销关系）
     * @return 分销课程列表（有分销关系则带上，没有则courseDistributerRel为null）
     */
    List<com.guomei.bean.curse.vo.CourseDistribute> selectDistributorCourseList(
        @Param("dto") com.guomei.bean.curse.dto.DistributorCourseListDTO dto
    );

}
